Reactã®èªåãããåŠçãè€æ°ã®ç¶æ æŽæ°ãæé©åããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããäžèŠãªåã¬ã³ããªã³ã°ãé²ãæ¹æ³ãåŠã³ãŸããäŸãšãã¹ããã©ã¯ãã£ã¹ãæ¢æ±ã
Reactã®èªåãããåŠçïŒããã©ãŒãã³ã¹åäžã®ããã®ç¶æ æŽæ°ã®æé©å
Reactã®ããã©ãŒãã³ã¹ã¯ãã¹ã ãŒãºã§ã¬ã¹ãã³ã·ããªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããã«éåžžã«éèŠã§ããããã©ãŒãã³ã¹ãåäžãããããã«å°å ¥ãããéèŠãªæ©èœã®1ã€ã¯ãèªåãããåŠçã§ãããã®æé©åææ³ã¯ãè€æ°ã®ç¶æ æŽæ°ãèªåçã«1ã€ã®åã¬ã³ããªã³ã°ã«ã°ã«ãŒãåããå€§å¹ ãªããã©ãŒãã³ã¹åäžã«ã€ãªãããŸããããã¯ãé »ç¹ãªç¶æ 倿Žã䌎ãè€éãªã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«éèŠã§ãã
Reactã®èªåãããåŠçãšã¯ïŒ
Reactã®æèã«ããããããåŠçãšã¯ãè€æ°ã®ç¶æ
æŽæ°ã1ã€ã®æŽæ°ã«ã°ã«ãŒãåããããã»ã¹ã§ããReact 18ããåã¯ããããåŠçã¯Reactã€ãã³ããã³ãã©ãŒå
ã§çºçããæŽæ°ã«ã®ã¿é©çšãããŠããŸãããsetTimeout
ãPromiseããŸãã¯ãã€ãã£ãã€ãã³ããã³ãã©ãŒå
ãªã©ãã€ãã³ããã³ãã©ãŒå€ã®æŽæ°ã¯ãããåŠçãããŸããã§ãããããã«ãããäžèŠãªåã¬ã³ããªã³ã°ãšããã©ãŒãã³ã¹ã®ããã«ããã¯ãçºçããå¯èœæ§ããããŸããã
React 18ã§ã¯ããã®æé©åãçºçå Žæã«é¢ä¿ãªãããã¹ãŠã®ç¶æ
æŽæ°ã«æ¡åŒµããèªåãããåŠçãå°å
¥ãããŸãããã€ãŸããç¶æ
æŽæ°ãReactã€ãã³ããã³ãã©ãŒå
ãsetTimeout
ã³ãŒã«ããã¯å
ããŸãã¯Promiseã®è§£æ±ºå
ã§è¡ããããã©ããã«ããããããReactã¯ããããèªåçã«1ã€ã®åã¬ã³ããªã³ã°ã«ãŸãšããŠãããåŠçããŸãã
èªåãããåŠçãéèŠãªçç±
èªåãããåŠçã«ã¯ãããã€ãã®éèŠãªå©ç¹ããããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒåã¬ã³ããªã³ã°ã®åæ°ãæžããããšã§ãReactã®èªåãããåŠçã¯ããã©ãŠã¶ãDOMãæŽæ°ããããã«å¿ èŠãªäœæ¥éãæå°éã«æããããé«éã§ã¬ã¹ãã³ã·ããªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«ã€ãªãããŸãã
- ã¬ã³ããªã³ã°ã®ãªãŒããŒãããã®åæžïŒååã¬ã³ããªã³ã°ã§ã¯ãReactãä»®æ³DOMãå®éã®DOMãšæ¯èŒããå¿ èŠãªå€æŽãé©çšããŸãããããåŠçã¯ãæ¯èŒåæ°ãæžããããšã§ããã®ãªãŒããŒããããåæžããŸãã
- äžè²«æ§ã®ãªãç¶æ ã®é²æ¢ïŒãããåŠçã«ãããã³ã³ããŒãã³ãã¯æçµçãªäžè²«æ§ã®ããç¶æ ã§ã®ã¿åã¬ã³ããªã³ã°ãããäžéãŸãã¯äžæçãªç¶æ ããŠãŒã¶ãŒã«è¡šç€ºãããã®ãé²ããŸãã
èªåãããåŠçã®ä»çµã¿
Reactã¯ãçŸåšã®å®è¡ã³ã³ããã¹ãã®çµäºãŸã§ç¶æ æŽæ°ã®å®è¡ãé ãããããšã«ãããèªåãããåŠçãå®çŸããŸããããã«ãããReactã¯ãã®ã³ã³ããã¹ãäžã«çºçãããã¹ãŠã®ç¶æ æŽæ°ãåéãããããã1ã€ã®æŽæ°ã«ãŸãšããŠãããåŠçã§ããŸãã
ãã®ç°¡ç¥åãããäŸãèããŠã¿ãŸãããã
function ExampleComponent() {
const [count1, setCount1] = useState(0);
const [count2, setCount2] = useState(0);
function handleClick() {
setTimeout(() => {
setCount1(count1 + 1);
setCount2(count2 + 1);
}, 0);
}
return (
<div>
<p>Count 1: {count1}</p>
<p>Count 2: {count2}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
}
React 18ããåã¯ããã¿ã³ãã¯ãªãã¯ãããšãsetCount1
ãšsetCount2
ã«å¯ŸããŠãããã1åãã€ã2åã®åã¬ã³ããªã³ã°ãçºçããŠããŸãããReact 18ã®èªåãããåŠçã§ã¯ãäž¡æ¹ã®ç¶æ
æŽæ°ããŸãšããŠãããåŠçãããåã¬ã³ããªã³ã°ã¯1åã®ã¿ã«ãªããŸãã
èªåãããåŠçã®åäœäŸ
1. é忿޿°
APIããããŒã¿ããã§ãããããªã©ã®éåææäœã§ã¯ãæäœãå®äºããåŸã«ç¶æ ãæŽæ°ããããšããããããŸããèªåãããåŠçã«ããããããã®ç¶æ æŽæ°ã¯ãéåæã³ãŒã«ããã¯å ã§çºçããå Žåã§ãããŸãšããŠãããåŠçãããŸãã
function DataFetchingComponent() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const jsonData = await response.json();
setData(jsonData);
setLoading(false);
} catch (error) {
console.error('Error fetching data:', error);
setLoading(false);
}
}
fetchData();
}, []);
if (loading) {
return <p>Loading...</p>;
}
return <div>Data: {JSON.stringify(data)}</div>;
}
ãã®äŸã§ã¯ãsetData
ãšsetLoading
ã®äž¡æ¹ãéåæã®fetchData
颿°å
ã§åŒã³åºãããŸããReactã¯ãããã®æŽæ°ããŸãšããŠãããåŠçããããŒã¿ã®ãã§ãããšããŒãç¶æ
ã®æŽæ°ãå®äºãããšã1åã®åã¬ã³ããªã³ã°ãè¡ãããŸãã
2. Promise
é忿޿°ãšåæ§ã«ãPromiseã¯Promiseã解決ãŸãã¯æåŠããããšãã«ç¶æ ãæŽæ°ããããšããããããŸããèªåãããåŠçã«ããããããã®ç¶æ æŽæ°ããŸãšããŠãããåŠçãããŸãã
function PromiseComponent() {
const [result, setResult] = useState(null);
const [error, setError] = useState(null);
useEffect(() => {
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
const success = Math.random() > 0.5;
if (success) {
resolve('Promise resolved!');
} else {
reject('Promise rejected!');
}
}, 1000);
});
myPromise
.then((value) => {
setResult(value);
setError(null);
})
.catch((err) => {
setError(err);
setResult(null);
});
}, []);
if (error) {
return <p>Error: {error}</p>;
}
if (result) {
return <p>Result: {result}</p>;
}
return <p>Loading...</p>;
}
ãã®å ŽåãæåãããšsetResult
ãšsetError(null)
ãåŒã³åºããã倱æãããšsetError
ãšsetResult(null)
ãåŒã³åºãããŸãããããã«ãããèªåãããåŠçã¯ãããã1åã®åã¬ã³ããªã³ã°ã«çµåããŸãã
3. ãã€ãã£ãã€ãã³ããã³ãã©ãŒ
Reactã®åæã€ãã³ããã³ãã©ãŒã§ã¯ãªãããã€ãã£ãã€ãã³ããã³ãã©ãŒïŒaddEventListener
ãªã©ïŒã䜿çšããå¿
èŠãããå ŽåããããŸããèªåãããåŠçã¯ããããã®å Žåã«ãæ©èœããŸãã
function NativeEventHandlerComponent() {
const [scrollPosition, setScrollPosition] = useState(0);
useEffect(() => {
function handleScroll() {
setScrollPosition(window.scrollY);
}
window.addEventListener('scroll', handleScroll);
return () => {
window.removeEventListener('scroll', handleScroll);
};
}, []);
return <p>Scroll Position: {scrollPosition}</p>;
}
setScrollPosition
ããã€ãã£ãã€ãã³ããã³ãã©ãŒå
ã§åŒã³åºãããå Žåã§ããReactã¯æŽæ°ããŸãšããŠãããåŠçãããŠãŒã¶ãŒãã¹ã¯ããŒã«ãããšãã«éå°ãªåã¬ã³ããªã³ã°ãé²ããŸãã
èªåãããåŠçã®ãªããã¢ãŠã
ãŸãã«ãèªåãããåŠçããªããã¢ãŠããããå ŽåããããŸããããšãã°ãUIãããã«æŽæ°ãããããã«ã忿޿°ã匷å¶ãããå ŽåããããŸããReactã¯ããã®ç®çã®ããã«flushSync
APIãæäŸããŸãã
泚æïŒflushSync
ã®äœ¿çšã¯æ§ããã«ããŠãã ãããããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸããå¯èœãªéãèªåãããåŠçã«äŸåããã®ãæåã§ãã
import { flushSync } from 'react-dom';
function ExampleComponent() {
const [count, setCount] = useState(0);
function handleClick() {
flushSync(() => {
setCount(count + 1);
});
}
return (<button onClick={handleClick}>Increment</button>);
}
ãã®äŸã§ã¯ãflushSync
ã¯Reactã«ç¶æ
ãããã«æŽæ°ããã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããããã«åŒ·å¶ããèªåãããåŠçããã€ãã¹ããŸãã
ç¶æ æŽæ°ãæé©åããããã®ãã¹ããã©ã¯ãã£ã¹
èªåãããåŠçã¯å€§å¹ ãªããã©ãŒãã³ã¹åäžããããããŸãããç¶æ æŽæ°ãæé©åããããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšãéèŠã§ãã
- 颿°åæŽæ°ã®äœ¿çšïŒåã®ç¶æ ã«åºã¥ããŠç¶æ ãæŽæ°ããå Žåã¯ãå€ãç¶æ ã«é¢ããåé¡ãåé¿ããããã«ã颿°åæŽæ°ïŒã€ãŸããç¶æ ã»ãã¿ãŒã«é¢æ°ãæž¡ãïŒã䜿çšããŸãã
- äžèŠãªç¶æ æŽæ°ã®åé¿ïŒå¿ èŠãªå Žåã«ã®ã¿ç¶æ ãæŽæ°ããŸããåãå€ã§ç¶æ ãæŽæ°ããããšã¯é¿ããŠãã ããã
- ã³ã³ããŒãã³ãã®ã¡ã¢åïŒ
React.memo
ã䜿çšããŠã³ã³ããŒãã³ããã¡ã¢åããäžèŠãªåã¬ã³ããªã³ã°ãé²ããŸãã - `useCallback`ãš`useMemo`ã®äœ¿çšïŒåã³ã³ããŒãã³ããäžå¿ èŠã«åã¬ã³ããªã³ã°ãããªãããã«ãpropsãšããŠæž¡ããã颿°ãšå€ãã¡ã¢åããŸãã
- `shouldComponentUpdate`ã«ããåã¬ã³ããªã³ã°ã®æé©åïŒã¯ã©ã¹ã³ã³ããŒãã³ãïŒïŒé¢æ°åã³ã³ããŒãã³ããšããã¯ãããäžè¬çã«ãªããŸããããå€ãã¯ã©ã¹ããŒã¹ã®ã³ã³ããŒãã³ãã䜿çšããŠããå Žåã¯ãpropsãšç¶æ
ã®å€æŽã«åºã¥ããŠã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããã¿ã€ãã³ã°ãå¶åŸ¡ããããã«ã
shouldComponentUpdate
ãå®è£ ããŸãã - ã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ãªã³ã°ïŒReact DevToolsã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãã
- äžå€æ§ã®èæ ®ïŒç¹ã«ãªããžã§ã¯ããé åãæ±ãå Žåã¯ãç¶æ ãäžå€ãšããŠæ±ããŸããããŒã¿ãçŽæ¥å€æŽããã®ã§ã¯ãªããããŒã¿ã®æ°ããã³ããŒãäœæããŸããããã«ããã倿Žã®æ€åºãããå¹ççã«ãªããŸãã
èªåãããåŠçãšã°ããŒãã«ãªèæ ®äºé
èªåãããåŠçã¯ãReactã®ã³ã¢ãªããã©ãŒãã³ã¹æé©åæ©èœã§ããããããŠãŒã¶ãŒã®å Žæããããã¯ãŒã¯é床ããŸãã¯ããã€ã¹ã«é¢ä¿ãªããã¢ããªã±ãŒã·ã§ã³å šäœã«ã¡ãªããããããããŸãããã ãããã®åœ±é¿ã¯ãã€ã³ã¿ãŒãããæ¥ç¶ãé ãå Žåããããã€ã¹ã®æ§èœãäœãå Žåã«é¡èã«ãªãå¯èœæ§ããããŸããåœéçãªãŠãŒã¶ãŒã«åããŠã¯ã以äžã®ç¹ã«æ³šæããŠãã ããã
- ãããã¯ãŒã¯é å»¶ïŒãããã¯ãŒã¯é å»¶ã倧ããå°åã§ã¯ãåã¬ã³ããªã³ã°ã®åæ°ãæžããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ç¥èŠãããå¿çæ§ãå€§å¹ ã«åäžãããããšãã§ããŸããèªåãããåŠçã¯ããããã¯ãŒã¯é å»¶ã®åœ±é¿ãæå°éã«æããã®ã«åœ¹ç«ã¡ãŸãã
- ããã€ã¹ã®æ§èœïŒåœã«ãã£ãŠããŠãŒã¶ãŒã䜿çšããããã€ã¹ã®åŠçèœåãç°ãªãå ŽåããããŸããèªåãããåŠçã¯ããªãœãŒã¹ãéãããŠããããŒãšã³ãããã€ã¹ã§ããããã¹ã ãŒãºãªãšã¯ã¹ããªãšã³ã¹ãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã
- è€éãªã¢ããªã±ãŒã·ã§ã³ïŒè€éãªUIãšé »ç¹ãªããŒã¿æŽæ°ã䌎ãã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒã®å°ççãªå Žæã«é¢ä¿ãªããèªåãããåŠçããæå€§ã®æ©æµãåããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒããã©ãŒãã³ã¹ã®åäžã¯ãã¢ã¯ã»ã·ããªãã£ã®åäžã«ã€ãªãããŸããããã¹ã ãŒãºã§å¿çæ§ã®é«ãã€ã³ã¿ãŒãã§ãŒã¹ã¯ãæ¯æŽæè¡ã«äŸåããŠããé害ã®ãããŠãŒã¶ãŒã«ãšã£ãŠã¡ãªããããããŸãã
çµè«
Reactã®èªåãããåŠçã¯ãReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ãã匷åãªæé©åææ³ã§ããè€æ°ã®ç¶æ æŽæ°ãèªåçã«1ã€ã®åã¬ã³ããªã³ã°ã«ã°ã«ãŒãåããããšã§ãã¬ã³ããªã³ã°ã®ãªãŒããŒããããåæžããäžè²«æ§ã®ãªãç¶æ ãé²ããããã¹ã ãŒãºã§ã¬ã¹ãã³ã·ããªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªãããŸããèªåãããåŠçã®ä»çµã¿ãçè§£ããç¶æ æŽæ°ãæé©åããããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãäžçäžã®ãŠãŒã¶ãŒã«åªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãã髿§èœãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããReact DevToolsãªã©ã®ããŒã«ã掻çšããããšã§ã倿§ãªã°ããŒãã«ç°å¢ã«ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãããã¡ã€ã«ãããã«æ¹è¯ããã³æé©åã§ããŸãã